import 'package:dio/dio.dart';
import 'package:gt_flutter_admin/models/index.dart';
import 'package:gt_flutter_admin/utils/request_utils.dart';

// **************************************************************************
// 认证服务
// **************************************************************************

/// 获取图片验证码
Future<Captcha> getCaptcha() {
  return RequestUtils.get(
    '/api/auth/captcha',
  ).then((result) => Captcha.fromJson(result.data!));
}

/// 用户登录
Future<Token> login(Map<String, dynamic> data) {
  return RequestUtils.post(
    '/api/auth/login',
    data,
  ).then((result) => Token.fromJson(result.data!));
}

// **************************************************************************
// 部门服务
// **************************************************************************

/// 获取部门列表
Future<Page> listDept({
  QueryRequest? queryRequest,
  String? deptName,
  bool? isLast,
}) {
  Map<String, dynamic> params = Map();
  params.addAll(queryRequest?.toJson() ?? Map());
  params['deptName'] = deptName;
  params['isLast'] = isLast;
  return RequestUtils.get(
    '/api/dept',
    params,
  ).then((result) => Page.fromJson(result.data!));
}

/// 获取部门详情
Future<Dept> getDept(num id) {
  return RequestUtils.get(
    '/api/dept/$id',
  ).then((result) => Dept.fromJson(result.data!));
}

/// 新增部门
Future createDept(Map<String, dynamic> data) {
  return RequestUtils.post('/api/dept', data);
}

/// 编辑部门
Future updateDept(Map<String, dynamic> data) {
  return RequestUtils.put('/api/dept', data);
}

/// 删除部门
Future deleteDept(num id) {
  return RequestUtils.delete('/api/dept', id);
}

// **************************************************************************
// 角色服务
// **************************************************************************

/// 获取角色列表
Future<Page> listRole({
  QueryRequest? queryRequest,
  String? roleName,
  String? remark,
}) {
  Map<String, dynamic> params = Map();
  params.addAll(queryRequest?.toJson() ?? Map());
  params['roleName'] = roleName;
  params['remark'] = remark;
  return RequestUtils.get(
    '/api/role',
    params,
  ).then((result) => Page.fromJson(result.data!));
}

/// 添加角色
Future createRole(Map<String, dynamic> data) {
  return RequestUtils.post('/api/role', data);
}

/// 删除角色
Future deleteRole(num roleId) {
  return RequestUtils.delete('/api/role', roleId);
}

/// 编辑角色
Future updateRole(Map<String, dynamic> data) {
  return RequestUtils.put('/api/role', data);
}

// **************************************************************************
// 用户服务
// **************************************************************************

/// 获取用户列表
Future<Page> listUser({QueryRequest? queryRequest, String? username}) {
  Map<String, dynamic> params = Map();
  params.addAll(queryRequest?.toJson() ?? Map());
  params['username'] = username;

  return RequestUtils.get('/api/user', params).then((result) {
    Page page = Page();
    if (result.data?.isNotEmpty ?? false) {
      page = Page.fromJson(result.data!);
    }
    return page;
  });
}

/// 新增用户
Future createUser(Map<String, dynamic> data) {
  return RequestUtils.post('/api/user', data);
}

/// 删除用户
Future deleteUser(num userId) {
  return RequestUtils.delete('/api/user', userId);
}

/// 编辑用户
Future updateUser(Map<String, dynamic> data) {
  return RequestUtils.put('/api/user', data);
}

/// 获取当前用户信息
Future<User> getCurrentUser() {
  return RequestUtils.get(
    '/api/user/my',
  ).then((result) => User.fromJson(result.data!));
}

// **************************************************************************
// 菜单服务
// **************************************************************************

/// 获取菜单目录树
Future<Page> listMenu({QueryRequest? queryRequest, String? type}) {
  Map<String, dynamic>? params = Map();
  params.addAll(queryRequest?.toJson() ?? Map());
  params['type'] = type ?? '0';
  return RequestUtils.get(
    '/api/menu',
    params,
  ).then((reult) => Page.fromJson(reult.data!));
}

/// 获取菜单详情
Future<Menu> getMenu(num id) {
  return RequestUtils.get(
    '/api/menu/$id',
  ).then((result) => Menu.fromJson(result.data!));
}

/// 编辑菜单
Future updateMenu(Map<String, dynamic> data) {
  return RequestUtils.put('/api/menu', data);
}

// **************************************************************************
// 文件服务
// **************************************************************************

/// 上传单文件
Future<File> uploadFile(File file) async {
  String filename = file.url.substring(file.url.lastIndexOf("/") + 1);
  FormData data = FormData.fromMap({
    'files': [MultipartFile.fromFileSync(file.url, filename: filename)],
  });

  List files = await RequestUtils.postFormData('/api/file', data);
  return File.fromJson(files.first);
}
